#define _CRT_SECURE_NO_WARNINGS 1
//int  Get_LinkList(LinkList H, ElemType key) {
//    LinkList i = (LinkList)malloc(sizeof(LNode));
//    i = H;
//    int o = 0;
//    while (i->next != NULL) {
//        if (i->data == key)
//            break;
//        i = i->next;
//        o++;
//    }
//    return o;
//}
//
//Status ListInsert(LinkList& H, int i, ElemType e) {
//    LinkList u = (LinkList)malloc(sizeof(LNode));
//    u = H;
//    for (int j = 0; j < i - 1; j++) {
//        u = u->next;
//    }
//    LinkList pnew = (LinkList)malloc(sizeof(LNode));
//    pnew->data = e;
//    pnew->next = u->next;
//    u->next = pnew;
//    return OK;
//}
//
//Status ListDelete(LinkList& H, int i) {
//    LinkList u = (LinkList)malloc(sizeof(LNode));
//    u = H;
//    for (int j = 0; j < i - 1; j++) {
//        u = u->next;
//    }
//    LinkList pnew = (LinkList)malloc(sizeof(LNode));
//    pnew = u->next->next;
//    u->next = pnew;
//    return OK;
//}
//
//int ListDelete(SqList & L, int i) {
//    if (i - 1 < 0 || i > L.length || i > MAXSIZE)
//        return 0;
//    for (int j = i - 1; j < L.length; j++) {
//        L.elem[j] = L.elem[j + 1];
//    }
//    L.length--;
//    return 1;
//}
//
//int ListInsert(SqList & L, int i, ElemType e) {
//    if (i - 1 < 0)
//        return 0;
//    if (i - 1 > L.length)
//        return 0;
//    if (L.length + 1 > MAXSIZE)
//        return 0;
//    for (int j = L.length; j > i - 1; j--) {
//        L.elem[j] = L.elem[j - 1];
//    }
//    L.length++;;
//    L.elem[i - 1] = e;
//    return 1;
//}
//
//Status InitList_Sq(SqList & L) {
//    L.elem = (int*)malloc(LIST_INIT_SIZE * sizeof(int));
//    L.length = 0;
//    L.listsize = LIST_INIT_SIZE;
//    return OK;
//}
//
//int Locate(SqList L, ElemType key) {
//    for (int i = 0; i < L.length; i++) {
//        if (key == L.elem[i])
//            return i;
//    }
//    return -1;
//}


int kthToLast(struct ListNode* head, int k) {
    struct ListNode* fast = head;
    struct ListNode* slow = head;
    if (head == NULL)
    {
        return NULL;
    }
    while (k--)
    {
        fast = fast->next;
    }
    while (fast)
    {
        fast = fast->next;
        slow = slow->next;
    }
    return slow->val;
}


struct ListNode* getIntersectionNode(struct ListNode* headA, struct ListNode* headB) {
    struct ListNode* pcurA = headA;
    struct ListNode* pcurB = headB;
    int lenA = 1, lenB = 1;
    while (pcurA->next)
    {
        pcurA = pcurA->next;
        lenA++;
    }
    while (pcurB->next)
    {
        pcurB = pcurB->next;
        lenB++;
    }
    if (pcurA != pcurB)
    {
        return NULL;
    }
    int gap = abs(lenA - lenB);
    struct ListNode* longlist = headA;
    struct ListNode* shortlist = headB;

    if (lenB > lenA)
    {
        longlist = headB;
        shortlist = headA;
    }
    while (gap--)
    {
        longlist = longlist->next;
    }
    while (longlist != shortlist)
    {
        longlist = longlist->next;
        shortlist = shortlist->next;
    }
    return shortlist;
}
